import pandas as pd
from sklearn.decomposition import PCA
from sklearn.feature_selection import VarianceThreshold
from scipy.stats import pearsonr
import matplotlib.pyplot as plt


def variance_demo():
    """
    过滤低方差特征
    :return:
    """
    # 1. 获取数据
    """
    index_col=0:这是一个可选参数，用于指定哪一列作为DataFrame的索引(index)
    如果不设置这个参数，pandas会自动生成一个从0开始的整数索引
    """
    data = pd.read_csv('./data/factor_returns.csv')
    data = data.iloc[:, 1:-2]
    # print(f"数据集：\n{data}")

    # 2. 创建一个转换器类
    transform = VarianceThreshold(threshold=10)
    # 3. 调用fit_transform
    data_new = transform.fit_transform(data)
    # print(f"过滤低方差特征后的数据集：\n{data_new}")
    # print(f"过滤低方差特征后的特征名：\n{transform.get_feature_names_out()}")
    # print(f"过滤后的形状：{data_new.shape}")

    # 计算两个变量的相关性
    r = pearsonr(data["pe_ratio"], data["pb_ratio"])
    print(f"两个变量的皮尔逊相关系数为：{r}")

    # 绘制散点图
    """
    plt.figure() 创建一个新的图形窗口
    figsize=(20, 8) 设置图形尺寸为宽20英寸、高8英寸
    dpi=100 设置分辨率为每英寸100像素（dots per inch）
    """
    plt.figure(figsize=(20, 8), dpi=100)
    """
    plt.scatter() 绘制散点图
    data["pe_ratio"] 作为x轴数据（市盈率）
    data["pb_ratio"] 作为y轴数据（市净率）
    """
    plt.scatter(data["pe_ratio"], data["pb_ratio"])
    plt.show()


def pca_demo():
    """
    PCA降维
    :return:
    """
    # 1. 获取数据
    data = [[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]]
    # 2. 创建一个转换器类
    transform = PCA(n_components=2)
    # 3. 调用fit_transform
    data_new = transform.fit_transform(data)
    print(f"降维后的数据集：\n{data_new}")


if __name__ == '__main__':
    # variance_demo()
    pca_demo()
